﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasDesktop.UILogic;
using Persistencia;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasDesktop.UILogic.Helpers;
using GestorDeFlotasDesktop.Asignacion;

namespace GestorDeFlotasDesktop.AbmAuto
{
    public partial class frmListadoAuto : BaseForm
    {
        private bool EsEliminar;
        public Auto AutoElegido { get; set; }
        public event EventHandler AutoSeleccionado;
        private FormMode? modo;
        public frmListadoAuto(bool esEliminar)
        {
            EsEliminar = esEliminar;
            InitializeComponent();
        }

        public frmListadoAuto(FormMode modo)
        {
            this.modo = modo;
            InitializeComponent();
        }


        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                base.OnVisibleChanged(e);
                if (!modo.HasValue)
                {
                    butEliminar.Visible = EsEliminar;
                    butModificar.Visible = !EsEliminar;
                }
                else
                {
                    butEliminar.Visible = false;
                    butModificar.Visible = false;
                    button1.Visible = true;
                }
                CargarCombos();
                CargarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarCombos()
        {
           
            List<string> marcas;
            if (Contexto.MarcasAutos == null)
            {
                List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectTodos<Auto>();
                marcas = new List<string>();
                autos.ForEach(a => marcas.Add(a.Marca));
                marcas = marcas.Distinct().ToList();
                Contexto.MarcasAutos = marcas;
            }
            else
                marcas = Contexto.MarcasAutos;

            List<ComboBoxItem> items= new List<ComboBoxItem>();
            items.Add(new ComboBoxItem("",""));
            foreach (string marca in marcas)
            {
                items.Add(new ComboBoxItem(marca,marca));
            }
            cmbMarca.ValueMember="Value";
            cmbMarca.DisplayMember="Text";            
            cmbMarca.Items.AddRange(items.ToArray());
            cmbMarca.SelectedIndex = 0;

            List<Reloj> relojes = Transaccion.Factoria<FactoriaReloj>().SelectTodos<Reloj>();
            items=new List<ComboBoxItem>();
            items.Add(new ComboBoxItem("", -1));
            foreach(Reloj r in relojes)
            {
                items.Add(new ComboBoxItem(r.NumeroDeSerie,r.Id));
            }
            cmbReloj.ValueMember = "Value";
            cmbReloj.DisplayMember = "Text";            
            cmbReloj.Items.AddRange(items.OrderBy(x=>x.Text).ToArray());

            cmbReloj.SelectedIndex = 0;
            cmbMarca.SelectedIndex = 0;
        }

        private void CargarTodos()
        {
            List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectTodos<Auto>();
            SetGridData(autos);
        }

        private void SetGridData(List<Auto> autos)
        {
            if (autos != null && autos.Count > 0)
            {
                GridCreation(dgvAutos);
                dgvAutos.DataSource = autos;
                dgvAutos.Visible = true;
                lblNoItems.Visible = false;

                dgvAutos.Columns["Reloj"].Visible = false;
                dgvAutos.Columns["Id"].Visible = false;
                dgvAutos.Columns["RelojString"].HeaderText = "Reloj";
            }
            else
            {
                lblNoItems.Visible = true;
                dgvAutos.Visible = false;
            }
        }

        private void buBuscar_Click(object sender, EventArgs e)
        {
            try
        {
            CargarConFiltros();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        }

        public void CargarConFiltros()
        {
            List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectAutosConFiltro(
               ValidatorHelper.getValue(cmbMarca), ValidatorHelper.getValue(txtModelo),
               ValidatorHelper.getValue(txtPatente), ValidatorHelper.getValue(txtLicencia),
               Convert.ToInt64(((ComboBoxItem)cmbReloj.SelectedItem).Value));
            SetGridData(autos);
        }

        private void buLimpiar_Click(object sender, EventArgs e)
        {
            try
            {
            txtLicencia.Text = string.Empty;
            txtModelo.Text = string.Empty;
            txtPatente.Text = string.Empty;
            cmbReloj.SelectedIndex = 0;
            cmbMarca.SelectedIndex = 0;

            CargarTodos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void frmListadoAuto_Load(object sender, EventArgs e)
        {

        }

        private void butEliminar_Click(object sender, EventArgs e)
        {
            try
            {
            Auto autoSeleccionado;

            autoSeleccionado = (Auto)dgvAutos.SelectedRows[0].DataBoundItem;
            DialogResult dialogResult = MessageBox.Show("Esta seguro que desea eliminar el auto seleccionado?", "Eliminar Auto", MessageBoxButtons.YesNo);
            if (dialogResult == DialogResult.Yes)
            {
                autoSeleccionado.Habilitado = false;
                Transaccion.Persistir();
                CargarConFiltros();
            }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void butModificar_Click(object sender, EventArgs e)
        {
            try
            {
                Auto autoSeleccionado;

                if (dgvAutos.SelectedRows.Count > 0)
                {
                    autoSeleccionado = (Auto)dgvAutos.SelectedRows[0].DataBoundItem;
                    new frmFormAuto(autoSeleccionado, this).Show();
                }
                else
                    MessageBox.Show("Debe seleccionar un auto para modificar");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                this.AutoElegido = (Auto)dgvAutos.SelectedRows[0].DataBoundItem;
                AutoSeleccionado(sender, e);
                this.Hide();
            }
            
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            
        }
   }
}

